[アップデート] AWSマネジメントコンソールにVPCエンドポイント経由でアクセスできるようになりました
インターネットに抜けずに閉域網からマネジメントコンソールにアクセスしたいな
こんにちは、のんピ(@non____97)です。
皆さんはインターネットに抜けずに閉域網からマネジメントコンソールにアクセスしたいなと思ったことはありますか? 私はあります。
世の中にはセキュリティルームなどインターネットへのルーティングがされていない / インターネットへのアクセスが許可されていないエリアがあったりします。
そして、システムの要件上、そのような場所から運用することが求められるケースがあります。
そのような環境でAWSの運用をするのはかなり大変です。何しろAWSマネジメントコンソールにアクセスするにはインターネットを経由しなければならないためです。
...と思っていると、「AWSマネジメントコンソールへのプライベートアクセスがGAされました」とアナウンスがありました。
これはとんでもないことです。
実際に試してみたので紹介します。
いきなりまとめ
- インターネットに抜けずに閉域網からマネジメントコンソールにアクセスを実現するものではない
- マネジメントコンソールで使用されるアセットにアクセスする際はインターネット接続が必要
- 完全に閉じたネットワークからVPCエンドポイント経由でアクセスしようとすると、
Unable to load content
と表示され、マネジメントコンソールのホームにアクセスすることはできない
- ユーザーがネットワーク内から任意のAWSアカウントにサインインすることを防ぐ際に有効
- VPCエンドポイントはマネジメントコンソールでアクセスするリージョンごとに以下の2つ
com.amazonaws.region.console
com.amazonaws.region.signin
- マネジメントコンソールからus-east-1にアクセスする/しないに関わらず、us-east-1にもVPCエンドポイントが必要
- DNSサーバーで
aws.amazon.com
のゾーンを作成し、以下のCNAMEレコード(Route 53 Private Hosted Zoneの場合はALIASレコード)が必要region.signin.aws.amazon.com
:com.amazonaws.region.console
に対するレコードregion.console.aws.amazon.com
:com.amazonaws.region.signin
に対するレコードsignin.aws.amazon.com
:com.amazonaws.region.console
に対するレコードconsole.aws.amazon.com
:com.amazonaws.region.signin
に対するレコード
- サービスによっては上述のFQDNにマッチしないものがあるため、
https[:]//configuration.private-access.console.amazonaws.com/region.conf
を確認の上、DNSレコードを作成する - インターネットを経由せずにマネジメントコンソールからサービスの操作を行いたい場合は、そのサービスのVPCエンドポイントを作成する必要がある
- マネジメントコンソールからサービスの操作を行う場合、マネジメントコンソールを開いているブラウザから直接そのサービスのサービスエンドポイントにアクセスするものがある
- 2023/5/11時点では東京リージョン非対応
- 未対応のサービスも多数ある
- VPCエンドポイント経由でマネジメントコンソールにアクセスした場合は、経由したVPCエンドポイントとVPCのIDを確認することができる
概要
AWSマネジメントコンソールへのプライベートアクセスとは
AWSマネジメントコンソールへのプライベートアクセスとは何を指しているのかから確認します。
AWS公式ドキュメントを確認すると、「VPCもしくはオンプレミスネットワーク内からマネジメントコンソールの使用を信頼されたアカウントのみに制限すること」と読み取れました。これにより、ユーザーがネットワーク内から任意のAWSアカウントにサインインすることを防ぐシナリオで役立つようです。
With AWS Management Console Private Access, you can limit the use of the AWS Management Console to your trusted accounts from within your Amazon Virtual Private Cloud (VPC) and on-premises networks.
AWS Management Console Private Access - AWS Management Console
AWS Management Console Private Access is useful in scenarios when you want to limit access to the AWS Management Console from your network only to a specified set of known AWS accounts in your organization. By doing so, you can you can prevent users from signing in to unexpected AWS accounts from within your network. You can implement these controls using the AWS Management Console VPC endpoint policy.
Overview of AWS Management Console Private Access security controls - AWS Management Console
そのため、「インターネットを抜けず閉域網からマネジメントコンソールにアクセスすること」に重きを置いているというよりかは、「マネジメントコンソールで利用可能なAWSアカウントを制限すること」が主題になりますね。
実際、マネジメントコンソールで使用されるアセットにアクセスする際は、引き続きインターネット接続が必要なようです。
Internet connectivity from your network is still required to access assets used by the AWS Management Console, such as static content (JavaScript, CSS, images), and all AWS services that are not enabled by AWS PrivateLink. For a list of the top-level domains used the AWS Management Console, see Troubleshooting.
Overview of AWS Management Console Private Access security controls - AWS Management Console
そのため、完全な閉域網からへのアクセスを行うことはできません。
仕組み
それでは、AWSマネジメントコンソールへのプライベートアクセスを実現するための仕組みを確認します。
一言で言えば、マネジメントコンソールアクセス時に対応したVPCエンドポイントを経由するようにDNSの設定を行います。
VPCエンドポイントはマネジメントコンソールでアクセスするリージョンごとに以下の2つが必要になります。
com.amazonaws.region.console
com.amazonaws.region.signin
ただし、マネジメントコンソールからus-east-1にアクセスする/しないに関わらず、us-east-1にもVPCエンドポイントが必要です。
You must always provision infrastructure and networking connectivity to the US East (N. Virginia) (us-east-1) Region, regardless of other Regions you use with the AWS Management Console.
Overview of AWS Management Console Private Access security controls - AWS Management Console
VPCエンドポイントの用意ができたら、作成したVPCエンドポイントを経由してマネジメントコンソールにアクセスするようにDNSの設定を行います。
具体的にはDNSサーバーでaws.amazon.com
のゾーンを作成し、以下のCNAMEレコード(Route 53 Private Hosted Zoneの場合はALIASレコード)が必要になります。
region.signin.aws.amazon.com
:com.amazonaws.region.console
に対するレコードregion.console.aws.amazon.com
:com.amazonaws.region.signin
に対するレコードsignin.aws.amazon.com
:com.amazonaws.region.console
に対するレコードconsole.aws.amazon.com
:com.amazonaws.region.signin
に対するレコード
基本的にはこちらのDNSレコードで良いですが、サービスによってはsupport.console.aws.amazon.com
などFQDNが異なる場合があります。
また、ブラウザから各サービスの操作を行う際に、VPCエンドポイントを経由させたい場合は別途対応したVPCエンドポイント(必要に応じて+DNSレコードも)を作成する必要があります。
「ブラウザから各サービスの操作を行う際に、VPCエンドポイントを通るってどういうこと?」と思われた方は以下記事をご覧ください。
以下AWS公式ドキュメントでも紹介されていますが、要するに「マネジメントコンソールからサービスの操作を行う場合、マネジメントコンソールを開いているブラウザから直接そのサービスのサービスエンドポイントにアクセスするものがあるよ」ということです。
This section describes the various network paths that the requests generated by your AWS Management Console can take to AWS services. In general, AWS service consoles are implemented with a mix of direct browser requests and requests that are proxied by the AWS Management Console web servers to AWS services. These implementations are subject to change without notice.
Implementing identity-based policies and other policy types - AWS Management Console
そのサービスのVPCエンドポイントがない場合は、インターネットを経由してサービスエンドポイントにアクセスしようとします。
どのFQDNやサービス、機能がどのVPCエンドポイントと対応しているかはhttps[:]//configuration.private-access.console.amazonaws.com/region.conf
から確認できます。
2023/5/11時点でのus-east-1の場合(https[:]//configuration.private-access.console.amazonaws.com/us-east-1.config.json
)は以下のとおりです。
us-east-1.config.json
(長いので折りたたんでいます)
{ "Version": "2020-10-12", "Region": "us-east-1", "ServiceDetails": [ { "ServiceName": "com.amazonaws.us-east-1.console", "PrivateIpv4DnsNames": [ "us-east-1.console.aws.amazon.com", "console.aws.amazon.com", "s3.console.aws.amazon.com", "global.console.aws.amazon.com", "*.widget.console.aws.amazon.com", "networkmanager.console.aws.amazon.com", "support.console.aws.amazon.com" ], "PrivateIpv6DnsNames": [], "VpcEndpointPolicyType": "IAM+CONSOLE", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.signin", "PrivateIpv4DnsNames": [ "signin.amazonaws.com", "us-east-1.signin.amazonaws.com" ], "PrivateIpv6DnsNames": [ "signin.amazonaws.com", "us-east-1.signin.amazonaws.com" ], "VpcEndpointPolicyType": "IAM+CONSOLE", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.access-analyzer", "PrivateIpv4DnsNames": [ "access-analyzer.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.application-autoscaling", "PrivateIpv4DnsNames": [ "application-autoscaling.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.appmesh", "PrivateIpv4DnsNames": [ "appmesh.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.athena", "PrivateIpv4DnsNames": [ "athena.us-east-1.amazonaws.com", "athena.us-east-1.api.aws" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.autoscaling", "PrivateIpv4DnsNames": [ "autoscaling.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.autoscaling-plans", "PrivateIpv4DnsNames": [ "autoscaling-plans.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.billingconductor", "PrivateIpv4DnsNames": [ "billingconductor.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.codeguru-profiler", "PrivateIpv4DnsNames": [ "codeguru-profiler.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.codeguru-reviewer", "PrivateIpv4DnsNames": [ "codeguru-reviewer.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.comprehend", "PrivateIpv4DnsNames": [ "comprehend.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.comprehendmedical", "PrivateIpv4DnsNames": [ "comprehendmedical.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.databrew", "PrivateIpv4DnsNames": [ "databrew.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.dms", "PrivateIpv4DnsNames": [ "dms.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.drs", "PrivateIpv4DnsNames": [ "drs.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.ec2", "PrivateIpv4DnsNames": [ "ec2.us-east-1.amazonaws.com", "ec2.us-east-1.api.aws" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.ecs", "PrivateIpv4DnsNames": [ "ecs.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.eks", "PrivateIpv4DnsNames": [ "eks.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.elasticache", "PrivateIpv4DnsNames": [ "elasticache.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.elasticfilesystem", "PrivateIpv4DnsNames": [ "elasticfilesystem.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.elasticmapreduce", "PrivateIpv4DnsNames": [ "elasticmapreduce.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.emr-containers", "PrivateIpv4DnsNames": [ "emr-containers.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.emr-serverless", "PrivateIpv4DnsNames": [ "emr-serverless.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.events", "PrivateIpv4DnsNames": [ "events.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.evidently", "PrivateIpv4DnsNames": [ "evidently.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.grafana", "PrivateIpv4DnsNames": [ "grafana.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.groundstation", "PrivateIpv4DnsNames": [ "groundstation.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.imagebuilder", "PrivateIpv4DnsNames": [ "imagebuilder.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.inspector2", "PrivateIpv4DnsNames": [ "inspector2.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.kendra", "PrivateIpv4DnsNames": [ "kendra.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.kms", "PrivateIpv4DnsNames": [ "kms.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.lambda", "PrivateIpv4DnsNames": [ "lambda.us-east-1.amazonaws.com", "lambda.us-east-1.api.aws" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.license-manager", "PrivateIpv4DnsNames": [ "license-manager.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.logs", "PrivateIpv4DnsNames": [ "logs.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.mgn", "PrivateIpv4DnsNames": [ "mgn.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.migrationhub-strategy", "PrivateIpv4DnsNames": [ "migrationhub-strategy.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.monitoring", "PrivateIpv4DnsNames": [ "monitoring.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.private-networks", "PrivateIpv4DnsNames": [ "private-networks.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.rds", "PrivateIpv4DnsNames": [ "rds.us-east-1.amazonaws.com", "rds.us-east-1.api.aws" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.redshift", "PrivateIpv4DnsNames": [ "redshift.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.redshift-data", "PrivateIpv4DnsNames": [ "redshift-data.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.rum", "PrivateIpv4DnsNames": [ "rum.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.s3", "PrivateIpv4DnsNames": [ "*.s3.us-east-1.amazonaws.com", "*.s3-accesspoint.us-east-1.amazonaws.com", "*.s3-control.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.s3-outposts", "PrivateIpv4DnsNames": [ "s3-outposts.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.sqs", "PrivateIpv4DnsNames": [ "sqs.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.ssm", "PrivateIpv4DnsNames": [ "ssm.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.ssm-contacts", "PrivateIpv4DnsNames": [ "ssm-contacts.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.ssm-incidents", "PrivateIpv4DnsNames": [ "ssm-incidents.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.states", "PrivateIpv4DnsNames": [ "states.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.synthetics", "PrivateIpv4DnsNames": [ "synthetics.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.transfer", "PrivateIpv4DnsNames": [ "transfer.us-east-1.amazonaws.com" ], "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.dynamodb", "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] }, { "ServiceName": "com.amazonaws.us-east-1.s3", "VpcEndpointPolicyType": "IAM", "CrossRegionDependencies": [] } ] }
サポートしているAWSリージョンとサービス
2023/5/11時点でのサポートされているリージョンは以下の通りです。東京リージョンはまだですね。
- 米国東部 (バージニア北部) : us-east-1
- 米国東部 (オハイオ) : us-east-2
- 米国西部 (オレゴン) : us-west-2
- 欧州 (アイルランド) : eu-west-1
- アジアパシフィック (シンガポール) : ap-southeast-1
2023/5/11時点でのサポートしているサービスは以下の通りです。
- Amazon API Gateway
- AWS App Mesh
- AWS Application Migration Service
- Amazon Athena
- AWS Auto Scaling
- AWS Billing Conductor
- AWS Cloud Map
- Amazon CloudFront
- Amazon CloudWatch
- AWS CodeArtifact
- Amazon CodeGuru
- Amazon Comprehend
- Amazon Comprehend Medical
- AWS Compute Optimizer
- AWS Console Home
- AWS Database Migration Service
- AWS DeepRacer
- Amazon DocumentDB
- Amazon DynamoDB
- Amazon EC2
- Amazon EC2 Global View
- EC2 Image Builder
- Amazon EC2 Instance Connect
- Amazon Elastic Container Registry
- Amazon Elastic Container Service
- AWS Elastic Disaster Recovery
- Amazon Elastic File System
- Amazon Elastic Kubernetes Service
- Amazon ElastiCache
- Amazon EMR
- Amazon EventBridge
- Amazon GameLift
- AWS Global Accelerator
- AWS Glue DataBrew
- AWS Ground Station
- Amazon GuardDuty
- AWS Identity and Access Management
- AWS Identity and Access Management Access Analyzer
- Amazon Inspector
- Amazon Kendra
- AWS Key Management Service
- Amazon Kinesis
- Amazon Kinesis Data Analytics
- Amazon Kinesis Data Firehose
- Amazon Kinesis Video Streams
- AWS Lambda
- Amazon Lex
- AWS License Manager
- Amazon Managed Grafana
- Amazon Managed Streaming for Apache Kafka
- Amazon Managed Workflows for Apache Airflow (MWAA)
- AWS Migration Hub Strategy Recommendations
- Amazon MQ
- Network Access Analyzer
- AWS Network Manager
- Amazon OpenSearch Service
- AWS Organizations
- Amazon S3 on Outposts
- Amazon SageMaker
- Amazon SageMaker Synthetic Data
- Service Quotas
- AWS Signer
- Amazon Simple Email Service
- Amazon Simple Queue Service
- Amazon Simple Storage Service
- AWS SQL Workbench
- AWS Step Functions
- AWS Support
- AWS Systems Manager
- AWS Transfer Family
- Unified Settings
- Amazon VPC IP Address Manager
最新のサポートしているAWSリージョンとサービスは以下AWS公式ドキュメントから確認できます。
やってみた
検証環境
それでは実際に試してみます。
検証環境は以下の通りです。
SSMセッションマネージャーのポートフォワーディングでWindows ServerのEC2インスタンスにRDP接続して、そこからブラウザ(Microsoft Edge)でマネジメントコンソールにアクセスします。
なお、インターネットへのアクセスはない環境です。マネジメントコンソールで使用されるアセットにアクセスする際は、引き続きインターネット接続が必要とのことですが、どのタイミングで要求されるのか確認してみます。
VPCエンドポイントの用意
まず、必要なVPCエンドポイントの用意をします。
VPCやEC2インスタンス、セキュリティグループの作成は割愛します。
com.amazonaws.region.console
を作成します。
一旦エンドポイントポリシーはフルアクセスで作成します。
com.amazonaws.region.signin
も同様に作成します。
作成したVPCエンドポイント一覧は以下の通りです。SSMセッションマネージャーでEC2インスタンスに接続するために、com.amazonaws.us-east-1.ssm
なども作成しています。
Route 53 Private Hosted Zoneの作成とDNSレコードの追加
次にRoute 53 Private Hosted Zoneの作成とDNSレコードの追加を行います。
作成するRoute 53 Private Hosted Zoneのゾーン名はaws.amazon.com
です。
Route 53 Private Hosted Zone作成後、VPCエンドポイントのALIASレコードを作成します。
EC2インスタンスからマネジメントコンソールにアクセス
それでは、EC2インスタンスからマネジメントコンソールにアクセスできることを確認します。
以下コマンドでSSMセッションマネージャーでポートフォワーディングをしてから、RDP接続をします。
> aws ssm start-session \ --target i-0b07711c4eb23a277 \ --document-name AWS-StartPortForwardingSession \ --parameters '{"portNumber":["3389"],"localPortNumber":["13389"]}'
RDP接続後、マネジメントコンソールにサインインする際のFQDNを名前解決します。
> nslookup signin.aws.amazon.com Server: ip-10-0-0-2.ec2.internal Address: 10.0.0.2 Non-authoritative answer: Name: signin.aws.amazon.com Address: 10.0.0.202
プライベートIPアドレスが返って来ましたね。
それでは、ブラウザ(Microsoft Edge)からhttps[:]//signin.aws.amazon.com/console/
にアクセスします。
はい、アクセスできました。
ユーザー名を入力してSighn in
をクリックします。
するとMFAの入力画面に遷移しました。
MFAのコードを入力してSubmit
をクリックします。
はい、Unable to load content
と表示され、マネジメントコンソールのホームにアクセスすることはできませんでした。
開発者ツールを眺めるとamazonaws.com
というPrivate Hosted Zoneで設定していないドメインのJavaScriptファイルをリクエストして失敗していました。
その他にもリクエストに失敗しているものがあるので眺めてみましょう。
awsstatic.com
やa2z.com
などのドメインに対してもリクエストを投げて失敗していますね。
こちらのドメインに対応するVPCエンドポイントは存在しないため、やはりインターネットを抜けず閉域網からマネジメントコンソールにアクセスすることはできないようです。
インターネットへのアクセス経路を追加して再チャレンジ
インターネットへのアクセスは必ず必要とのことがわかったので、インターネットへのアクセス経路を追加して再チャレンジします。
検証環境は以下の通りです。
この構成に変更してからブラウザをリロードすると、マネジメントコンソールのホームを表示することができました。
一部のサービスは、AWSマネジメントコンソールのプライベートアクセスでは使用できません。
と表示されているため、VPCエンドポイント経由でアクセスできていることが分かりますね。
また、どのVPCエンドポイント、VPCを経由しているかはリージョン名の横のアイコンから確認できます。
それでは、色々試してみましょう。
まず、別リージョン(us-east-2
)にアクセスしてみます。
はい、アクセスできませんでした。これは対応するVPCエンドポイントを作成していないためです。
次にVPCのコンソールを開いてみます。
こちらはアクセスできましたね。
なお、ダークモードにしたタイミングで気づいたのですがマネジメントコンソールのプライベートアクセスに対応していないサービスのコンソールに遷移することはできないようです。
サービスを検索すると、より分かりやすくこのサービスは AWS マネジメントコンソールのプライベートアクセスでは利用できません
と表記されています。
次に、S3のコンソールにアクセスしてみます。
S3のコンソールのFQDNは一般的なコンソールのFQDNregion.console.aws.amazon.com
と異なり、s3.console.aws.amazon.com
であるためアクセスできませんでした。
S3のコンソールにアクセスしたい場合は、s3.console.aws.amazon.com
にアクセスした際にcom.amazonaws.region.console
のIPアドレスを返すようにDNSレコードを設定しましょう。
VPCエンドポイントを使ったアカウントの制限
次に、VPCエンドポイントによるアカウントの制限を行います。
AWS公式ドキュメントに例があったので、こちらを参考に設定します。
com.amazonaws.us-east-1.signin
のVPCエンドポイントのポリシーを以下のように変更します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": "*", "Condition": { "StringEquals": { "aws:PrincipalAccount": [ "<AWSアカウント>" ] } } } ] }
aws:PrincipalAccount
で定義していないAWSアカウントにサインインしようとするとYour account doesn't have permission to use AWS Management Console Private Access
と怒られました。
しっかり効果を発揮できていますね。
次にcom.amazonaws.us-east-1.signin
のVPCエンドポイントのポリシーをフルアクセスにして、com.amazonaws.us-east-1.console
のVPCエンドポイントポリシーを以下のように変更します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": "*", "Condition": { "StringEquals": { "aws:PrincipalAccount": [ "<AWSアカウント>" ] } } } ] }
こちらはaws:PrincipalAccount
で定義していないAWSアカウントにサインイン状態で設定しました。
ブラウザをリロードすると、カスタムレイアウトをロードできませんでした
と表示されるようになりました。
サービスのコンソールにアクセスすると、Access Denied
と表示されるようになりました。
ただし、キャッシュが効いているのか今までアクセスしていたコンソールには継続してアクセスできます。
一度サインアウトして、再度サインインしようとするとAccess Denied
と表示されるようになりました。
VPCエンドポイントポリシーでマネジメントコンソールからサインインできるアカウントを制御できるぞ
AWSマネジメントコンソールにVPCエンドポイント経由でアクセスできるようになったアップデートを紹介しました。
VPCエンドポイントポリシーを活用することで、マネジメントコンソールからサインインできるアカウントを制御できますね。
実際に導入する場合は、以下のようにaws.amazon.com
のPrivate Hosted Zoneを関連付けたVPC上のRoute 53 Resolver Inbound Endpointに対してaws.amazon.com
の条件付きフォワーダーを設定することになるのかなと思います。
抜粋 : Reference architecture - AWS Management Console
実際に触ってみたい方は、EC2インスタンスやWorkSpacesを使ったテスト環境のCloudFormationテンプレートがあるので、そちらを参照すると良いかと思います。
- Test set up with Amazon EC2 - AWS Management Console
- Test set up with Amazon WorkSpaces - AWS Management Console
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!